// 描述函数
// 描述函数主要是描述函数的参数和返回值
// function fn(x: number, y: number): number {
//   return x + y
// }

// let fun: (x: number, y: number) => number // 这个是描述变量fun未来要存储的是一个有两个形参,并且返回值是数字的函数

// // 定义了函数,并描述了函数的形参和返回值
// fun = function (a: number, b: number, c: number): number {
//   return a + b + c
// }

// let fun = function (a: number, b: number): number {
//   return a + b
// }

// let fun = (x: number, y: number): number => {
//   return x + y
// }
// let fun = (x: number, y: number): number => {
//   return x + y
// }

// fun(1, 2) //注意: 在js中,实参随便写.多或少都无所谓.但是ts中形参有几个,实参必须有几个,多或少都不可以

// 函数中的可选参数
// y就是可选参数
// 注意: 可选参数决不能写在必填参数的前面
// let fun = (x: number, y?: number): number => {
//   return x + y
// }

// fun(1)
// 函数的默认值
// 注意: ts中也支持写形参的默认值,但是可选参数不要写默认值
// let fun = (x: number = 1, y?: number): number => {
//   return x + y
// }

// fun(1)

// 剩余参数
// let fun = (x: number = 1, y?: number, ...args): number => {
//   const test: number[] = args
//   return x + y
// }

// fun(12, 3, 3, 4, 5, 6, 7)

// 函数重载
// function reverse(x: number): number
// function reverse(x: string): string
// function reverse(x: number | string): number | string | void {
//   if (typeof x === 'number') {
//     return Number(x.toString().split('').reverse().join(''))
//   } else if (typeof x === 'string') {
//     return x.split('').reverse().join('')
//   }
// }

// reverse(123).toFixed
// reverse('345').trim()

// 了解: 用接口描述函数

interface Ifun {
  (x: number, y: number): number
}
function fun(x: number, y: number): number {
  return x + y
}

let test1: Ifun = fun
